/* Neste arquivo se cria a GUI e conecta-se os sinais.
 * Código não relacionado com a GUI está implementado
 * em backend.c e numeros.c */
#include <gtk/gtk.h>
#include <errno.h>

#include "numeros.h"
#include "backend-privado.h"
#include "../ep1.h"

void chama_resolve (GtkToolButton *toolbutton, gpointer user_data) {
	GtkWidget *dialog;

	resolveSudoku();

	if(!msgVitoria())
	{
		dialog = gtk_message_dialog_new (GTK_WINDOW(user_data),	GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "Não foi possível resolver!");
		gtk_dialog_run (GTK_DIALOG (dialog));
		gtk_widget_destroy (dialog);
	}
}

/* Esta função mostra o dialogo para selecionar o sudoku. Retorna NULL se o usuário cancelar */
char *escolhe_arquivo_sudoku() {
	GtkWidget *dialog;
	char *arquivo = NULL;

	dialog = gtk_file_chooser_dialog_new ("Selecione o sudoku que deseja jogar",
					      NULL,
					      GTK_FILE_CHOOSER_ACTION_OPEN,
					      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
					      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
					      NULL);
	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "sudokus");

	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
	    arquivo = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));

	gtk_widget_destroy (dialog);
	return arquivo;
}

/* Esta função carrega uma imagem. Usada para carregar o ícone */
GdkPixbuf *create_pixbuf(const gchar * filename)
{
   GdkPixbuf *pixbuf;
   GError *error = NULL;
   pixbuf = gdk_pixbuf_new_from_file(filename, &error);
   if(!pixbuf) {
      fprintf(stderr, "%s\n", error->message);
      g_error_free(error);
   }

   return pixbuf;
}

int main (int argc, char* argv[])
{
	char *arquivo;
	int i,j;
	GtkWidget *dialog;
	GtkWidget *window;
	GtkWidget *aspectFrame;
	GtkWidget *vbox;
	GtkWidget *table;
	GtkWidget *eBox;
	GdkColor preto;

	GtkWidget *toolbar;
	GtkToolItem *toolbar_resolver;
	GtkToolItem *toolbar_sair;


	/* Inicializa o GTK */
	gtk_init(&argc, &argv);

	/* Se o usuário clicar cancelar, esta função retorna NULL */
	arquivo = escolhe_arquivo_sudoku();
	if (arquivo == NULL)
	{
		g_free(arquivo);
		return 0;
	}

	/* Carrega o sudoku. Retorna 0 em caso de erro */
	if (carrega_sudoku(arquivo) == 0)
	{
		dialog = gtk_message_dialog_new (NULL,
		                                 GTK_DIALOG_MODAL,
		                                 GTK_MESSAGE_ERROR,
		                                 GTK_BUTTONS_CLOSE,
		                                 "Erro carregando o arquivo '%s': %s",
		                                 arquivo, g_strerror (errno));
		gtk_dialog_run (GTK_DIALOG (dialog));
		gtk_widget_destroy (dialog);
		g_free(arquivo);
		return 0;
	}
	g_free(arquivo);

	numeros_inicializa_widgets();

	/* Cria a janela principal */
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), TITULO_JANELA);
	gtk_window_set_default_size(GTK_WINDOW(window), 700, 500);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("GUI/gnome-sudoku.png"));

	/* Cria os componentes usados na janela */
	vbox = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(window), vbox);

	toolbar = gtk_toolbar_new();
	gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
	gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);
	toolbar_resolver = gtk_tool_button_new_from_stock(GTK_STOCK_APPLY);
	gtk_tool_button_set_label(GTK_TOOL_BUTTON(toolbar_resolver), "Resolver");
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolbar_resolver, -1);
	toolbar_sair = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolbar_sair, -1);
	gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);

	aspectFrame = gtk_aspect_frame_new(NULL, 0.5, 0.5, 1.0, FALSE);
	gtk_frame_set_shadow_type(GTK_FRAME(aspectFrame), GTK_SHADOW_NONE);

	table = gtk_table_new(9,9,TRUE);
	gtk_table_set_col_spacings(GTK_TABLE(table),2);
	gtk_table_set_row_spacings(GTK_TABLE(table),2);
	/* Damos um espaço maior para as linhas e colunas formando caixa de 3x3 */
	gtk_table_set_col_spacing(GTK_TABLE(table),2,4);
	gtk_table_set_row_spacing(GTK_TABLE(table),2,4);
	gtk_table_set_col_spacing(GTK_TABLE(table),5,4);
	gtk_table_set_row_spacing(GTK_TABLE(table),5,4);

	gtk_container_set_border_width(GTK_CONTAINER(table),2);

	for(i=0; i<9; i++)
		for(j=0; j<9; j++)
		{
			gtk_table_attach_defaults(GTK_TABLE(table), numeros[i*9+j].eventBox, j, j+1,i,i+1);
			numeros_repinta(i+1, j+1);
		}

	/* Colocamos a tabela em um EventBox pois se não fizermos isso não podemos setar a cor (GtkTable não contém uma XWindow. Detalhes do GTK+ no X) */
	eBox=gtk_event_box_new();
	gtk_container_add(GTK_CONTAINER(eBox), table);
	gtk_container_add(GTK_CONTAINER(aspectFrame), eBox);
	gtk_box_pack_end(GTK_BOX(vbox), aspectFrame, TRUE, TRUE, 2);

	/* Setamos a cor do eventBox para preto (assim tornarmos o fundo da tabela preto) */
	gdk_color_parse("black", &preto);
	gtk_widget_modify_bg(eBox, GTK_STATE_NORMAL, &preto);
	gtk_widget_modify_base(eBox, GTK_STATE_NORMAL, &preto);
	gtk_widget_modify_fg(eBox, GTK_STATE_NORMAL, &preto);

	/* Conectamos os sinais (setamos as funções para cada evento) */
	g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(G_OBJECT(toolbar_sair), "clicked", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(G_OBJECT(toolbar_resolver), "clicked", G_CALLBACK(chama_resolve), window);

	/* Mostra a janela */
	gtk_widget_show_all(window);

	/* Inicia o loop principal. É nesse loop que se espera por eventos */
	gtk_main();

	return 0;
}
